#ifndef __SYSTEM_H_
#define __SYSTEM_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "sdkconfig.h"
#include "stm32h7xx.h"


/* 编译器支持 */
#if defined(__GNUC__)
#define ALIGN(n)                __attribute__((aligned(n)))
#define SECTION(x)              __attribute__((section(x)))
#define __AT_RAM(x)             __attribute__((section(".ARM.__at_" #x)))
#define __AT_RAM_ITCM(x)        __attribute__((section(".itcmram.__at_" #x)))
#define __AT_RAM_DTCM(x)        __attribute__((section(".ARM.__at_" #x)))
#define __AT_RAM_AXI(x)         __attribute__((section(".ram_d1_axi.__at_" #x)))
#define __AT_RAM_SRAM1(x)       __attribute__((section(".ram_d2_sram1.__at_" #x)))
#define __AT_RAM_SRAM2(x)       __attribute__((section(".ram_d2_sram2.__at_" #x)))
#define __AT_RAM_SRAM3(x)       __attribute__((section(".ram_d2_sram3.__at_" #x)))
#define __AT_RAM_SRAM4(x)       __attribute__((section(".ram_d3_sram4.__at_" #x)))
#define __AT_RAM_BKUP(x)        __attribute__((section(".ram_d3_bkup.__at_" #x)))

#elif defined(__CC_ARM) || defined(__CLANG_ARM)
#define ALIGN(n)                __attribute__((aligned(n)))
#define SECTION(x)              __attribute__((section(x)))
#define __AT_RAM(x)             __attribute__((at(x)))
#define __AT_RAM(x)             __attribute__((at(x)))
#define __AT_RAM_ITCM(x)        __attribute__((at(x)))
#define __AT_RAM_DTCM(x)        __attribute__((at(x)))
#define __AT_RAM_AXI(x)         __attribute__((at(x)))
#define __AT_RAM_SRAM1(x)       __attribute__((at(x)))
#define __AT_RAM_SRAM2(x)       __attribute__((at(x)))
#define __AT_RAM_SRAM3(x)       __attribute__((at(x)))
#define __AT_RAM_SRAM4(x)       __attribute__((at(x)))
#define __AT_RAM_BKUP(x)        __attribute__((at(x)))

#else
 #error "Please select compiler in your application (in sys.h file)"
#endif


/**
 * 注：GCC目前变量是不支持指定地址的，只能指定到某个LD中定义的section，地址由编译器自动分配
 *     ARMCC的变量是支持指定地址的。
 */



/* export func */

void system_int_enable(void);
void system_int_disable(void);
void system_soft_reset(void);
void system_get_mcu_sn(uint32_t *sn0, uint32_t *sn1, uint32_t *sn2);


#ifdef __cplusplus
}
#endif

#endif // __SYSTEM_H_
